﻿///////////////////////////////////////////////////////////////////////////////
/// Copyright (c) by longshuang@msn.cn 2014.
/// All rights reserved.
///
/// @File	: Engine.Application.hpp
/// @Brief	: 通用程序入口封装
/// @Author	: Leo Zhao <longshuang@msn.cn>
/// @Date	: 2015-03-18
///
/// CHANGELOG
/// 	2015-03-18	初版提交
///////////////////////////////////////////////////////////////////////////////
#ifndef		__ENGINE_APPLICATION_INCLUDE__
#define		__ENGINE_APPLICATION_INCLUDE__

#include	<string>
#include	<atomic>
#include	<csignal>

namespace Engine {

	/// @Brief	: 通用程序APP基类
	/// @Note	: 一个程序只允许一个类继承自Application且该类只有一个对象！！！
	class Application {
	public:
		Application();
		virtual ~Application();

		/// @Brief	: 启动一个Application，会初始化程序日志存放、信号捕获等
		/// @Param	: nArgc		参数个数
		/// @Param	: pArgv		参数列表
		/// @Return	: NONE
		void	Start(int nArgc, char * pArgv[]);
		
		/// @Brief	: 终止一个程序的运行
		/// @Param	: nExitCode	退出代码
		/// @Return	: NONE
		void	Exit(int nExitCode);

		virtual bool	OnInit(int nArgc, char * pArgv[]) { return true; }
		virtual bool	OnBreath() { return true; }
		virtual void	OnSignal(int nSignal) { if (nSignal == SIGTERM || nSignal == SIGINT) Exit(nSignal); }
		virtual void	OnUnInit() {}

	protected:
		std::atomic<bool>	bShouldExit;
		int					nExitCode;
	};

}

#endif//!	__ENGINE_APPLICATION_INCLUDE__
